home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac-Source 1994 July
/
Mac-Source_July_1994.iso
/
C and C++
/
Science⁄Math
/
Scientist's Helper src
/
s.helper.5
/
regproc.c
next >
Wrap
C/C++ Source or Header
|
1986-02-05
|
3KB
|
101 lines
#include "all.h"
#include "regtabext.h"
ForCommand() /*procedure for loop*/
{
int i, j, k;
SToI( command.cmdWord[2], &i);
SToI( command.cmdWord[3], &j);
if (strlen(command.cmdWord[4])==0) {
strcpy(command.cmdWord[4],"1");
}
SToI( command.cmdWord[4], &k);
if ( (k==0) || ( (i<j) && (k<0) ) || ( (i>j) && (k>0) ) ) {
ErrMsg("bad parameters in for");
}
if (!SetVar( command.cmdWord[1], command.cmdWord[2] ) ) {
ErrMsg("couldnt create variable in for statement");
}
if (loops.numLoops < maxLoops) {
loops.lineNum[loops.numLoops] = mem.stack[mem.stackPtr];
strcpy( loops.varName[loops.numLoops], command.cmdWord[1] );
loops.endValue[loops.numLoops] = j;
loops.increment[loops.numLoops] = k;
loops.numLoops++;
}
else {
ErrMsg("too many levels of for loops");
}
}
NextCommand()
{
int i, j, match;
char vVal[80], vNam[80];
match = FALSE;
for( i=0; i<maxLoops; i++ ) {
if( strcmp(command.cmdWord[1],loops.varName[i])==0) {
match = TRUE;
break;
}
}
if (!match) {
ErrMsg("next has no corresponding for");
}
strcpy( vNam, "@" );
strcat( vNam, command.cmdWord[1] );
match = GetVar( vNam, vVal );
if (!match) {
ErrMsg("couldnt find for loop variable");
}
SToI( vVal, &j );
j=j + loops.increment[i];
IToS( j, vVal );
if ( !SetVar(command.cmdWord[1], vVal) ) {
ErrMsg("couldnt set for loop variable");
}
if( ((loops.increment[i]>0) && (loops.endValue[i]<j)) ||
((loops.increment[i]<0) && (loops.endValue[i]>j)) ) {
DelVar(command.cmdWord[1]);
if (i<(loops.numLoops-1)) {
for (j=i+1; j<loops.numLoops; j++ ) {
loops.lineNum[j-1]=loops.lineNum[j];
strcpy(loops.varName[j-1],loops.varName[j]);
loops.endValue[j-1] =loops.endValue[j];
loops.increment[j-1] = loops.increment[j];
} /*end for*/
} /*end if*/
loops.numLoops--;
}
else {
if (loops.lineNum[i] < (*prText)->nLines) {
mem.stack[ mem.stackPtr ] = loops.lineNum[i];
}
else {
ErrMsg("attempt to jump off end of procedure memory");
}
}
}
ReturnCommand()
{
int i, tempBoolean;
if (!mem.active) {
ErrMsg("cant return from console");
}
else if (mem.stackPtr==0) { /*return to console*/
NoPendingInput();
mem.active = FALSE;
mem.stackPtr = -1;
for (i=0; i<loops.numLoops; i++ ) { /*delete any loop variables*/
tempBoolean = DelVar(loops.varName[i]);
}
loops.numLoops = 0;
}
else { /*return to next level of subroutines*/
mem.stackPtr--;
}
}